package jnpf.database.util;

import com.baomidou.mybatisplus.annotation.TableField;
import jnpf.database.model.dto.DataSourceDTO;
import jnpf.database.model.interfaces.DataSourceMod;
import jnpf.exception.DataException;
import jnpf.util.StringUtil;
import lombok.Data;
import org.springframework.beans.BeanUtils;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;

/**
 * 数据源基础工具类
 *
 * @author JNPF开发平台组
 * @version V3.1.0
 * @copyright 引迈信息技术有限公司
 * @date 2021/3/16 8:49
 */
@Data
@Component
@ConfigurationProperties(prefix = "spring.datasource")
public class DataSourceUtil implements DataSourceMod {

    /**
     * 数据库类型
     */
    @TableField("F_DBTYPE")
    private String dbType;

    /**
     * 主机ip
     */
    @TableField("F_HOST")
    private String host;

    /**
     * 端口
     */
    @TableField("F_PORT")
    private Integer port;

    /**
     * 库名
     */
    @TableField("F_SERVICENAME")
    private String dbName;

    /**
     * 用户
     */
    @TableField("F_USERNAME")
    private String userName;

    /**
     * 密码
     */
    @TableField("F_PASSWORD")
    private String password;

    /**
     * 表空间
     */
    @TableField(value = "F_TABLESPACE")
    private String dbTableSpace;

    /**
     * 模式
     */
    @TableField(value = "F_DBSCHEMA")
    private String dbSchema;

    /**
     * 数据连接jdbc-url参数
     */
    @TableField(exist = false)
    private String urlParams;

    /**
     * url地址
     */
    @TableField(exist = false)
    private String url;

    /**
     * 数据连接jdbc-url参数
     */
    @TableField(exist = false)
    private String prepareUrl;

    /**
     * 驱动包
     */
    @TableField(exist = false)
    private String driver;

    /**
     * oracle多方式登录参数
     */
    @TableField(value = "F_OracleParam")
    private String oracleParam;

    public String getAutoUsername() throws DataException {
        if(StringUtil.isEmpty(this.userName)){
            return DbTypeUtil.getEncodeDb(this.dbType).getDbaUsername();
        }else {
            return this.userName;
        }
    }

    public String getAutoPassword() throws DataException {
        if(StringUtil.isEmpty(this.password)){
            return getAutoUsername();
        }else {
            return this.password;
        }
    }

    /**
     * -- 这里的参数dataSourceUtil是spring托管的全局唯一变量，
     * New对象防止数据源互串，防止Bean覆盖
     */
    @Override
    public DataSourceDTO convertDTO(){
        return convertDTO(null);
    }

    @Override
    public DataSourceDTO convertDTO(String dbName){
        return convertDTO(dbName, 1);
    }

    protected DataSourceDTO convertDTO(String dbName, Integer dataSourceFrom){
        DataSourceDTO dataSourceDTO = new DataSourceDTO();
        BeanUtils.copyProperties(this, dataSourceDTO);
        if(StringUtil.isNotEmpty(dbName)){
            dataSourceDTO.setDbName(dbName);
        }
        dataSourceDTO.setDataSourceFrom(dataSourceFrom);
        return dataSourceDTO;
    }

}
